package com.haojin.java;

/**
 * @author .29.
 * @create 2022-03-30 18:34
 */

/**
 * 例子：创建三个买票窗口买票，总票数为100张.使用的是继承Thread类的方式来做
 * <p>
 * 存在线程安全问题，待解决！
 *
 *
 *
 * @author .29.
 * @create 2022-03-30 14:56
 */
// 说明：在继承Thread类创建的多线程的方式中，慎用this充当同步监视器
class Window extends Thread {
    private static int ticket = 100;
    private static Object obj = new Object();

    @Override
    public void run() {
        while (true) {
//            synchronized (obj) {
            synchronized (Window.class) {//Class c = Window.class(Window只会加载一次，满足所有线程共用一个同步监视器)

                if (ticket > 0) {

//                    try {
//                        Thread.sleep(88);
//                    } catch (InterruptedException e) {
//                        e.printStackTrace();
//                    }

                    System.out.println(Thread.currentThread().getName() + "卖票，票号为：" + ticket);
                    ticket--;
                } else return;
            }

        }
    }
}

public class WindowTest2 {
    public static void main(String[] args) {
        Window w1 = new Window();
        Window w2 = new Window();
        Window w3 = new Window();

        w1.setName("窗口1");
        w3.setName("窗口3");
        w2.setName("窗口2");

        w2.start();
        w3.start();
        w1.start();
    }
}